<!DOCTYPE html><html><head><title>MySQL学习笔记（Day018：磁盘）</title><meta charset='utf-8'><link href='https://dn-maxiang.qbox.me/res-min/themes/marxico.css' rel='stylesheet'><style>

.note-content  {font-family: 'Helvetica Neue', Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', 'WenQuanYi Micro Hei', SimSun, Song, sans-serif;}
</style></head><body><div id='preview-contents' class='note-content'>
                        <div id="wmd-preview" class="preview-content"></div>
                    <div id="wmd-preview-section-5744" class="wmd-preview-section preview-content">

</div><div id="wmd-preview-section-5745" class="wmd-preview-section preview-content">

<h1 id="mysql学习笔记day018磁盘">MySQL学习笔记（Day018：磁盘）</h1>

<p><p class="note-tags "><code class="notebook">MySQL学习</code> </p></p>

<div><div class="toc"><div class="toc">
<ul>
<li><a href="#mysql学习笔记day018磁盘">MySQL学习笔记（Day018：磁盘）</a><ul>
<li><a href="#一-iostat">一. iostat</a></li>
<li><a href="#二-磁盘">二. 磁盘</a><ul>
<li><a href="#1-磁盘的访问模式">1. 磁盘的访问模式</a></li>
<li><a href="#2-磁盘的分类">2. 磁盘的分类</a></li>
<li><a href="#3-提升iops性能的手段">3. 提升IOPS性能的手段</a></li>
<li><a href="#4-raid类别">4. RAID类别</a></li>
<li><a href="#5-raid卡">5. RAID卡</a></li>
<li><a href="#6-文件系统和操作系统">6. 文件系统和操作系统</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>

</div><div id="wmd-preview-section-5746" class="wmd-preview-section preview-content">

<h2 id="一-iostat">一. iostat</h2>

</div><div id="wmd-preview-section-5747" class="wmd-preview-section preview-content">

<pre class="prettyprint hljs-dark"><code class="language-bash hljs"><span class="hljs-comment line-number">1.</span><span class="hljs-comment">#</span><br><span class="hljs-comment line-number">2.</span><span class="hljs-comment"># 安装 iostat</span><br><span class="hljs-comment line-number">3.</span><span class="hljs-comment">#</span><br><span class="hljs-comment line-number">4.</span>shell&gt; yum install sysstat <br><span class="hljs-comment line-number">5.</span><span class="hljs-comment"># debian 系： apt-get install sysstat</span><br><span class="hljs-comment line-number">6.</span><br><span class="hljs-comment line-number">7.</span><span class="hljs-comment"># 使用</span><br><span class="hljs-comment line-number">8.</span>shell&gt; iostat -xm <span class="hljs-number">3</span> <span class="hljs-comment"># x表示显示扩展统计信息，m表示以兆为单位显示，3表示每隔3秒显示</span><br><span class="hljs-comment line-number">9.</span><span class="hljs-comment"># 输出如下：</span><br><span class="hljs-comment line-number">10.</span>avg-cpu:  %user   %nice %system %iowait  %steal   %idle<br><span class="hljs-comment line-number">11.</span>           <span class="hljs-number">0.58</span>    <span class="hljs-number">0.00</span>    <span class="hljs-number">0.33</span>    <span class="hljs-number">0.00</span>    <span class="hljs-number">0.00</span>   <span class="hljs-number">99.08</span><br><span class="hljs-comment line-number">12.</span><br><span class="hljs-comment line-number">13.</span>Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util<br><span class="hljs-comment line-number">14.</span>sda               <span class="hljs-number">0.00</span>     <span class="hljs-number">0.00</span>    <span class="hljs-number">0.00</span>    <span class="hljs-number">0.67</span>     <span class="hljs-number">0.00</span>     <span class="hljs-number">0.00</span>     <span class="hljs-number">8.00</span>     <span class="hljs-number">0.00</span>    <span class="hljs-number">2.00</span>    <span class="hljs-number">0.00</span>    <span class="hljs-number">2.00</span>   <span class="hljs-number">1.00</span>   <span class="hljs-number">0.07</span><br><span class="hljs-comment line-number">15.</span>sdb               <span class="hljs-number">0.00</span>     <span class="hljs-number">0.00</span>    <span class="hljs-number">0.00</span>    <span class="hljs-number">0.00</span>     <span class="hljs-number">0.00</span>     <span class="hljs-number">0.00</span>     <span class="hljs-number">0.00</span>     <span class="hljs-number">0.00</span>    <span class="hljs-number">0.00</span>    <span class="hljs-number">0.00</span>    <span class="hljs-number">0.00</span>   <span class="hljs-number">0.00</span>   <span class="hljs-number">0.00</span><br></code></pre>

<table>
<thead>
<tr>
  <th align="center">CPU属性</th>
  <th align="center">说明</th>
</tr>
</thead>
<tbody><tr>
  <td align="center">%user</td>
  <td align="center">CPU处在用户模式下的时间百分比</td>
</tr>
<tr>
  <td align="center">%nice</td>
  <td align="center">CPU处在带NICE值的用户模式下的时间百分比</td>
</tr>
<tr>
  <td align="center">%sys</td>
  <td align="center">CPU处在系统模式下的时间百分比</td>
</tr>
<tr>
  <td align="center">%iowait</td>
  <td align="center">CPU等待IO完成时间的百分比</td>
</tr>
<tr>
  <td align="center">%steal</td>
  <td align="center">管理程序维护另一个虚拟处理器时，虚拟CPU的无意的等待时间的百分比</td>
</tr>
<tr>
  <td align="center">%idle</td>
  <td align="center">闲置cpu的百分比</td>
</tr>
</tbody></table>


<blockquote>
  <p><strong>提示：</strong> <br>
  如果%iowait的值过高，表示硬盘存在I/O瓶颈; <br>
  如果%idle值高，表示CPU较空闲，如果%idle值高但系统响应慢时，有可能是CPU等待分配内存，此时应加大内存容量。 <br>
  如果%idle值如果<code>持续</code>很低，那么系统的CPU处理能力相对较低，表明系统中最需要解决的资源是CPU。</p>
</blockquote>

<table>
<thead>
<tr>
  <th align="center">Device属性</th>
  <th align="center">说明</th>
</tr>
</thead>
<tbody><tr>
  <td align="center">rrqm/s</td>
  <td align="center">每秒进行 merge 的读操作数目</td>
</tr>
<tr>
  <td align="center">wrqm/s</td>
  <td align="center">每秒进行 merge 的写操作数目</td>
</tr>
<tr>
  <td align="center">r/s</td>
  <td align="center">每秒完成的读 I/O 设备次数</td>
</tr>
<tr>
  <td align="center">w/s</td>
  <td align="center">每秒完成的写 I/O 设备次数</td>
</tr>
<tr>
  <td align="center">rsec/s</td>
  <td align="center">每秒读扇区数</td>
</tr>
<tr>
  <td align="center">wsec/s</td>
  <td align="center">每秒写扇区数</td>
</tr>
<tr>
  <td align="center">rkB/s</td>
  <td align="center">每秒读K字节数</td>
</tr>
<tr>
  <td align="center">wkB/s</td>
  <td align="center">每秒写K字节数</td>
</tr>
<tr>
  <td align="center">avgrq-sz</td>
  <td align="center">平均每次设备I/O操作的数据大小 (扇区)</td>
</tr>
<tr>
  <td align="center">avgqu-sz</td>
  <td align="center">平均I/O队列长度</td>
</tr>
<tr>
  <td align="center">await</td>
  <td align="center">平均每次设备I/O操作的等待时间 (毫秒)</td>
</tr>
<tr>
  <td align="center">svctm</td>
  <td align="center">平均每次设备I/O操作的服务时间 (毫秒)</td>
</tr>
<tr>
  <td align="center">%util</td>
  <td align="center">一秒中有百分之多少的时间用于 I/O 操作，即被io消耗的cpu百分比</td>
</tr>
</tbody></table>


<blockquote>
  <p><strong>提示：</strong> <br>
  如果 %util 接近 100%，说明产生的I/O请求太多，I/O系统已经满负荷，该磁盘可能存在瓶颈。 <br>
  如果 svctm 比较接近 await，说明 I/O 几乎没有等待时间； <br>
  如果 await 远大于 svctm，说明I/O队列太长，io响应太慢，则需要进行必要优化。 <br>
  如果avgqu-sz比较大，也表示有当量io在等待。</p>
</blockquote>

<hr>

</div><div id="wmd-preview-section-5748" class="wmd-preview-section preview-content">

<h2 id="二-磁盘">二. 磁盘</h2>

</div><div id="wmd-preview-section-5749" class="wmd-preview-section preview-content">

<h3 id="1-磁盘的访问模式">1. 磁盘的访问模式</h3>

<ul><li>顺序访问 <br>
<ul>
<li>顺序的访问磁盘上的块；</li>
<li>一般经过测试后，得到该值的单位是<code>MB/s</code>，表示为磁盘<code>带宽</code>，普通硬盘在 50~ 100 MB/s</li></ul></li>
<li>随机访问 <br>
<ul>
<li>随机的访问磁盘上的块</li>
<li>也可以用MB/s进行表示，但是通常使用<code>IOPS</code>（每秒处理IO的能力），普通硬盘在 100-200 IOPS</li></ul></li>
</ul>

<p><img longdesc="./Selection_001.png" alt="磁盘的访问模式" title="" type="image/png" src="" class=""></p>

<blockquote>
  <p>拷贝文件属于顺序访问，<code>数据库</code>中访问数据属于<code>随机访问</code>。 <br>
  数据库对数据的访问做了优化，把随机访问转成顺序访问。</p>
</blockquote>

</div><div id="wmd-preview-section-15488" class="wmd-preview-section preview-content">

<h3 id="2-磁盘的分类">2. 磁盘的分类</h3>

<ul><li><p>HDD</p>

<ul>
<li>盘片通过旋转，磁头进行定位，读取数据；</li>
<li>顺序性较好，随机性较差；</li>
<li>常见转速 <br>
<ul>
<li>笔记本硬盘：5400转/分钟；</li>
<li>桌面硬盘：7200转/分钟；</li>
<li>服务器硬盘：10000转/分钟、15000转/分钟；</li>
<li>SATA：120 ~ 150 IOPS</li>
<li>SAS ：150 ~ 200 IOPS</li></ul></li></ul>

<blockquote>
  <p>从理论上讲，15000转/分钟，最高是 15000/60 约等于250IOPS <br>
  由于机械盘片需要旋转，转速太高无法很好的散热</p>
  
  <p>如果一个HDD对4K的块做随机访问是0.8MB/s，可通过<code>0.8 *（1 / 4）= 200</code> 或者 <code>（0.8 * 1000） / 4=200</code>得到<code>IOPS</code>，但是这个值存在部分干扰因素，如cache等</p>
</blockquote></li>
<li><p>SSD</p>

<ul>
<li>纯电设备</li>
<li>由FLash Memory组成</li>
<li>没有读写磁头</li>
<li>MLC闪存颗粒对一般企业的业务够用。目前SLC闪存颗粒价格较贵</li>
<li><p>IOPS高</p>

<ul>
<li>50000+ IOPS</li>
<li><p>读写速度非对称 以 <a href="http://www.intel.com/content/www/us/en/solid-state-drives/ssd-dc-s3500-spec.html" target="_blank">INTEL SSD DC-S3500</a>为例子：</p>

<ul>
<li>Random 4KB3 Reads: Up to 75,000 IOPS </li>
<li>Random 4KB Writes: Up to 11,500 IOPS</li>
<li>Random 8KB3 Reads: Up to 47,500 IOPS</li>
<li>Random 8KB Writes: Up to 5,500 IOPS</li></ul></li>
<li><p>当写入数据时，要先擦除老数据，再写入新数据</p></li>
<li><p>擦除数据需要擦除整个区域（128K or 256K）一起擦除（自动把部分有用的数据挪到别的区域）</p>

<blockquote>
  <p>对比发现4K性能要优于8K的性能，几乎是2倍的差距，当然16K就更明显，所以当使用SSD时，建议数据库页大小设置成4K或者是8K，<code>innodb_page_size=8K</code>） <br>
  上线以前，SSD需要经过严格的压力测试（一周时间），确保性能平稳</p>
</blockquote></li></ul></li>
<li><p>Endurance Rating</p>

<ul>
<li>表示该SSD的寿命是多少</li>
<li>比如450TBW，表示这个SSD可以反复写入的数据总量是450T（包括添加和更新）</li></ul></li>
<li><p>SSD线上参数设置</p>

<ul>
<li><p>磁盘调度算法改为Deadline</p>

<pre class="prettyprint hljs-dark"><code class="language-bash hljs"><span class="hljs-comment line-number">1.</span><span class="hljs-built_in">echo</span> deadline &gt; /sys/block/sda/queue/scheduler  <span class="hljs-comment"># deadline适用于数据库，HDD也建议改成Deadline</span><br></code></pre></li>
<li><p>MySQL参数</p>

<ul>
<li><code>innodb_log_file_size=4G</code>  该参数设置的尽可能大</li>
<li><code>innodb_flush_neighbors=0</code></li></ul>

<blockquote>
  <p>性能更平稳，且至少有15%的性能提升</p>
</blockquote></li></ul></li>
<li><p>SSD 品牌推荐</p>

<ul>
<li>Intel</li>
<li>FusionIO</li>
<li>宝存</li></ul></li>
<li><p>不是很建议使用PCI-E的Flash卡（PCI-E插槽的SSD） </p>

<ul>
<li>性能过剩</li>
<li>安装比较麻烦</li></ul></li></ul></li>
</ul></div><div id="wmd-preview-section-14138" class="wmd-preview-section preview-content">

<h3 id="3-提升iops性能的手段">3. 提升IOPS性能的手段</h3>

<ul><li><p>通过 RAID 技术</p>

<ul>
<li>功耗较高</li>
<li>IOPS在2000左右</li></ul></li>
<li><p>通过购买共享存储设备</p>

<ul>
<li>价格非常昂贵</li>
<li>但是比较稳定</li>
<li>底层还是通过RAID实现</li></ul></li>
<li><p>直接使用SSD</p>

<ul>
<li>性能较好的SSD可以达到 <code>万级别的IOPS</code></li>
<li>建议可以用SSD + RAID5，RAID1+0太奢侈</li></ul></li>
</ul>

</div><div id="wmd-preview-section-14139" class="wmd-preview-section preview-content">

<h3 id="4-raid类别">4. RAID类别</h3>

<ul><li><p>RAID0 <br>
<img longdesc="./130px-RAID_0.svg.png" alt="RAID0" title="" type="image/png" src="" class=""></p>

<ul>
<li>速度最快</li>
<li>没有冗余备份</li></ul></li>
<li><p>RAID1 <br>
<img longdesc="./130px-RAID_1.svg.png" alt="RAID1" title="" type="image/png" src="" class=""></p>

<ul>
<li>可靠性高</li>
<li>读取速度理论上等于硬盘数量的倍数</li>
<li>容量等于一个硬盘的容量</li></ul></li>
<li><p>RAID5 <br>
<img longdesc="./220px-RAID_5.svg.png" alt="RAID5" title="" type="image/png" src="" class=""></p>

<ul>
<li>至少要3块硬盘</li>
<li>通过对数据的奇偶检验信息存储到不同的磁盘上，来恢复数据，最多只能坏一块</li>
<li>属于折中方案</li></ul></li>
<li><p>RAID6 <br>
<img longdesc="./270px-RAID_6.svg.png" alt="RAID6" title="" type="image/png" src="" class=""></p>

<ul>
<li>至少是4块硬盘</li>
<li>和RAID5比较，RAID6增加第二个独立的奇偶校验信息，写入速度略受影响</li>
<li>数据可靠性高，可以同时坏两块</li>
<li>由于使用了双校验机制，恢复数据速度较慢</li></ul></li>
<li><p>RAID1+0 <br>
<img longdesc="./220px-RAID_10.svg.png" alt="RAID 1+0" title="" type="image/png" src="" class=""></p></li>
<li><p>RAID5+0 <br>
<img longdesc="./RAID_50.png" alt="Alt text" title="" type="image/png" src="" class=""></p></li>
</ul>

</div><div id="wmd-preview-section-14600" class="wmd-preview-section preview-content">

<h3 id="5-raid卡">5. RAID卡</h3>

<ul><li><p>BBU</p>

<ul>
<li>Battery Backup Unit</li>
<li>目前几乎所有RAID卡都带BBU</li>
<li>需要电池保证写入的可靠性（在断电后，将RAID卡<code>内存</code>中的缓存的数据刷入到磁盘）</li>
<li>电池有充放电时间 (30天左右一个周期，充放电会切换成 Write Through，导致性能下降) <br>
<ul>
<li>使用<code>闪存（Flash）</code>的方式，就不会有充放电性能下降的问题</li></ul></li></ul></li>
<li><p>RAID卡缓存</p>

<ul>
<li>Write Backup （<code>强烈建议开启缓存</code>）</li>
<li>Write Through (不使用缓存，直接写入)</li></ul></li>
<li><p>LSI-RAID卡相关命令</p>

<ul>
<li><p>查看电量百分比</p>

<pre class="prettyprint hljs-dark"><code class="language-bash hljs"><span class="hljs-comment line-number">1.</span>[root@<span class="hljs-built_in">test</span>_raid ~]<span class="hljs-comment"># megacli -AdpBbuCmd -GetBbuStatus -aALL |grep "Relative State of Charge"</span><br><span class="hljs-comment line-number">2.</span>Relative State of Charge: <span class="hljs-number">100</span> %<br></code></pre></li>
<li><p>查看充电状态</p>

<pre class="prettyprint hljs-dark"><code class="language-bash hljs"><span class="hljs-comment line-number">1.</span>[root@<span class="hljs-built_in">test</span>_raid ~]<span class="hljs-comment"># megacli -AdpBbuCmd -GetBbuStatus -aALL |grep "Charger Status"</span><br><span class="hljs-comment line-number">2.</span>Charger Status: Complete<br></code></pre></li>
<li><p>查看缓存策略</p>

<pre class="prettyprint hljs-dark"><code class="language-bash hljs"><span class="hljs-comment line-number">1.</span>[root@<span class="hljs-built_in">test</span>_raid ~]<span class="hljs-comment"># megacli -LDGetProp -Cache -LALL -a0</span><br><span class="hljs-comment line-number">2.</span>Adapter <span class="hljs-number">0</span>-VD <span class="hljs-number">0</span>(target id: <span class="hljs-number">0</span>): Cache Policy:WriteBack, ReadAdaptive, Direct, No Write Cache <span class="hljs-keyword">if</span> bad BBU<br></code></pre></li></ul></li>
</ul>

</div><div id="wmd-preview-section-15723" class="wmd-preview-section preview-content">

<h3 id="6-文件系统和操作系统">6. 文件系统和操作系统</h3>

<ul><li><p>文件系统</p>

<ul>
<li>XFS/EXT4</li>
<li>noatime (不更新文件的atime标记，减少系统的IO访问)</li>
<li>nobarrier （禁用barrier，可以提高性能，前提是使用write backup和使用BBU）</li></ul>

<blockquote>
  <p>mount -o noatime,nobarrier /dev/sda1 /data</p>
</blockquote></li>
<li><p>操作系统</p>

<ul>
<li>推荐Linux</li>
<li>关闭SWAP</li></ul></li>
</ul></div><div id="wmd-preview-section-footnotes" class="preview-content"></div></div></body></html>